package cn.seaboot.admin.file.resource;

import cn.seaboot.commons.file.FilenameUtils;
import cn.seaboot.commons.lang.Symbol;
import cn.seaboot.commons.core.ClassPathResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * ResourceDataService 主要用于管理 data 目录下的文件，实际上，有必要的话，可以读取 resource 下的全部配置文件。
 * 因为是系统内部静态资源拷贝到系统外，不做文件是否存在的判断，此处抛出异常需在项目正式使用前解决
 * <p>
 * 要求：
 * 1、抛出异常需在项目部署的时候解决（强制）
 * 2、目录层级尽可能不要超过2层（不强制，根据 api 选择适合自己的函数）
 *
 * @author Mr.css
 * @version 2019-12-11
 */
@Service
public class ClassPathResourceService {
    private final Logger logger = LoggerFactory.getLogger(ClassPathResourceService.class);

    /**
     * 资源文件路径
     *
     * @param type      文件类型
     * @param name      文件名
     * @param extension 包括扩展名
     * @return InputStream
     * @throws IOException - 因为是系统内部资源拷贝到系统外，不做文件是否存在的判断，此处抛出异常需在正式使用前解决
     */
    public InputStream openInputSteam(String type, String name, String extension) throws IOException {
        String path = type + File.separator + name + Symbol.PERIOD + extension;
        FilenameUtils.validFilePath(path, "Invalid file path!");
        return ClassPathResource.getInputStream(path);
    }

    /**
     * 资源文件拷贝到
     *
     * @param type 文件类型
     * @param name 文件名，包括扩展名
     * @return InputStream
     * @throws IOException - 因为是系统内部资源拷贝到系统外，不做文件是否存在的判断，此处抛出异常需在正式使用前解决
     */
    public InputStream openInputSteam(String type, String name) throws IOException {
        String path = type + File.separator + name;
        FilenameUtils.validFilePath(path, "Invalid file path!");
        return ClassPathResource.getInputStream(path);
    }

    /**
     * 拷贝到
     *
     * @param path data后面的全路径，包括扩展名，不以斜杠开始
     * @return InputStream
     * @throws IOException - 因为是系统内部资源拷贝到系统外，不做文件是否存在的判断，此处抛出异常需在正式使用前解决
     */
    public InputStream openInputSteam(String path) throws IOException {
        FilenameUtils.validFilePath(path, "Invalid file path!");
        return ClassPathResource.getInputStream(path);
    }
}
